package com.sykj.cloud.system.service.impl;

import com.sykj.cloud.common.core.utils.DateUtils;
import com.sykj.cloud.common.core.utils.IdUtils;
import com.sykj.cloud.common.core.utils.SpringUtils;
import com.sykj.cloud.common.core.utils.StringUtils;
import com.sykj.cloud.common.security.utils.SecurityUtils;
import com.sykj.cloud.system.api.domain.SysRole;
import com.sykj.cloud.system.domain.OrgDeptRole;
import com.sykj.cloud.system.domain.SysRoleMenu;
import com.sykj.cloud.system.mapper.OrgDeptRoleMapper;
import com.sykj.cloud.system.mapper.SysRoleMapper;
import com.sykj.cloud.system.mapper.SysRoleMenuMapper;
import com.sykj.cloud.system.service.ISysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * 系统角色Service业务层处理
 *
 * @author mr.will
 * @date 2021-03-17
 */
@Service
public class SysRoleServiceImpl implements ISysRoleService
{
    @Autowired
    private SysRoleMapper sysRoleMapper;

    @Autowired
    SysRoleMenuMapper sysRoleMenusMapper;

    @Autowired
    OrgDeptRoleMapper deptRoleMapper;



    /**
     * 新增系统角色
     *
     * @param sysRole 系统角色
     * @return 结果
     */
    @Override
    @Transactional
    public int insertSysRole(SysRole sysRole)
    {
        sysRole.setGuid(IdUtils.fastSimpleUUID());
        sysRole.setCreateTime(DateUtils.getNowDate());
        sysRole.setCreateBy("");
        sysRoleMapper.insertSysRole(sysRole);
        return insertRoleMenu(sysRole);
    }


    /**
     * 新增角色菜单信息
     *
     * @param role 角色对象
     */
    public int insertRoleMenu(SysRole role)
    {
        int rows = 1;
        // 新增用户与角色管理
        List<SysRoleMenu> list = new ArrayList<SysRoleMenu>();

        for (String menuId : role.getMenuIds())
        {
            SysRoleMenu srm = new SysRoleMenu();
            srm.setRoleId(role.getGuid());
            srm.setMenuId(menuId);
            srm.setCreateTime(DateUtils.getNowDate());
            srm.setCreateBy("");
            list.add(srm);
        }
        if (list.size() > 0)
        {
            rows = sysRoleMenusMapper.batchRoleMenus(list);
        }
        return rows;
    }

    /**
     * 修改系统角色
     *
     * @param sysRole 系统角色
     * @return 结果
     */
    @Override
    public int updateSysRole(SysRole sysRole)
    {
        sysRole.setUpdateTime(DateUtils.getNowDate());
        sysRole.setUpdateBy("");
        sysRoleMapper.updateSysRole(sysRole);
        // 删除角色与菜单关联

        sysRoleMenusMapper.deleteRoleMenuByRoleId(new SysRoleMenu(sysRole.getGuid(), SecurityUtils.getUserIds(),DateUtils.getNowDate()));
        return insertRoleMenu(sysRole);

    }

    /**
     * 批量删除系统角色
     *
     * @param guids 需要删除的系统角色ID
     * @return 结果
     */
    @Override
    public int deleteSysRoleByIds(String[] guids)
    {
        return sysRoleMapper.deleteSysRoleByIds(guids);
    }

    /**
     * 删除系统角色信息
     *
     * @param guid 系统角色ID
     * @return 结果
     */
    @Override
    public int deleteSysRoleById(String guid)
    {
        SysRole sysRole=new SysRole();
        sysRole.setGuid(guid);
        sysRole.setDeleteBy("");
        sysRole.setDeleteTime(DateUtils.getNowDate());
        return sysRoleMapper.deleteSysRoleById(sysRole);
    }



    /**
     * 查询系统角色
     *
     * @param guid 系统角色ID
     * @return 系统角色
     */
    @Override
    public SysRole getSysRoleById(String guid)
    {
        return sysRoleMapper.getSysRoleById(guid);
    }

    /**
     * 查询系统角色列表
     *
     * @param sysRole 系统角色
     * @return 系统角色
     */
    @Override
    public List<SysRole> listSysRoles(SysRole sysRole)
    {
        return sysRoleMapper.listSysRoles(sysRole);
    }

    @Override
    public List<String> listRolesByUserId(String userId) {
        return sysRoleMapper.listRolesByUserId(userId);
    }

    @Override
    public List<SysRole> listRoleAll() {
        return SpringUtils.getAopProxy(this).listSysRoles(new SysRole());
    }

    @Override
    public Set<String> listRolePermissionByUserId(String userId) {
        List<SysRole> perms = sysRoleMapper.listRolePermissionByUserId(userId);
        Set<String> permsSet = new HashSet<>();
        for (SysRole perm : perms)
        {
            if (StringUtils.isNotNull(perm))
            {
                permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
            }
        }
        return permsSet;

    }

    @Override
    public void checkRoleAllowed(SysRole role) {
//        if (StringUtils.isNotNull(role.getGuid()) && role.isAdmin())
//        {
//            throw new CustomException("不允许操作超级管理员角色");
//        }
    }

    @Override
    public int authDataScope(SysRole role) {
        // 修改角色信息
        sysRoleMapper.updateSysRole(role);
        // 删除角色与部门关联
        deptRoleMapper.deleteOrgDeptRoleByRoleId(role.getGuid());
        // 新增角色和部门信息（数据权限）
        return insertRoleDept(role);
    }


    /**
     * 新增角色部门信息(数据权限)
     *
     * @param role 角色对象
     */
    public int insertRoleDept(SysRole role)
    {
        int rows = 1;
        // 新增角色与部门（数据权限）管理
        List<OrgDeptRole> list = new ArrayList<OrgDeptRole>();
        for (String deptId : role.getDeptIds())
        {
            OrgDeptRole dr = new OrgDeptRole();
            dr.setRoleId(role.getGuid());
            dr.setDeptId(deptId);
            list.add(dr);
        }
        if (list.size() > 0)
        {
            rows = deptRoleMapper.batchOrgDeptRole(list);
        }
        return rows;
    }


}
